回顧一下機器學習的流程,昨天詳細講解完機器學習的前處理,今天要來介紹機器學習中的特徵工程(Feature Engineering)。
特徵工程我們把他分為兩大類,第一類是資料清理,第二類是特徵過濾(資料降維):
除了昨天講解的資料缺失值、異常值清理,還有會依照資料屬性像是分類數據、文本、圖像進行處理。
一種常見類型的非數字數據是分類數據,可以利用One-Hot Encoding
及Label Encoding
的方式,以房價數據為例:
data = [{'price': 850000, 'rooms': 4, 'neighborhood': 'Queen Anne'},
{'price': 700000, 'rooms': 3, 'neighborhood': 'Fremont'},
{'price': 650000, 'rooms': 3, 'neighborhood': 'Wallingford'},
{'price': 600000, 'rooms': 2, 'neighborhood': 'Fremont'}]
利用one-hot encoding編碼的方式,可以有效率的判斷所指示值為1或0代表存在或不存在。
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False, dtype=int)
vec.fit_transform(data)
將一份具有代表性的文本,轉換為一組有代表性的數值。例如,挖掘社交軟體的數據,將挖掘到的資料透過單詞計數轉換為數值,計算其中每個單詞的出現次數,並將結果放在表格中。
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
vec = CountVectorizer()
X = vec.fit_transform(sample)
pd.DataFrame(X.toarray(), columns=vec.get_feature_names())
輸出結果是一個稀疏矩陣記錄每個單詞出現的次數:
這種方法存在一些問題:原始單詞計數會導致對於非常頻繁出現的單詞過於重視的特徵,並且在某些分類算法中結果可能會比較不好。文字頻率(term frequency-inverse document frequency,TF-IDF)
,可以通過衡量它們在文檔中出現的頻率來對字數進行加權。
from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
X = vec.fit_transform(sample)
pd.DataFrame(X.toarray(), columns=vec.get_feature_names())
機器學習分析的資料不局限於數據資料,還需分析影像資料集,常見的影像特徵處理Derived Features
:
當我們從輸入數據構造多項式特徵時,我們在超參數和模型驗證中看到了,線性回歸直接轉換為多項式回歸中,不是通過分類來改變模型,而是通過轉換輸入,這種方式稱為「基函數回歸(basis function regression)」。
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4, 5])
y = np.array([4, 2, 1, 3, 7])
plt.scatter(x, y);
可以利用線性回歸(LinearRegression)的方式,將數據擬合至一條直線。
from sklearn.linear_model import LinearRegression
X = x[:, np.newaxis]
model = LinearRegression().fit(X, y)
yfit = model.predict(X)
plt.scatter(x, y)
plt.plot(x, yfit);
從上方的輸出結果中,可以看到我們需要更有效的方式來運算x和y的關係。
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=3, include_bias=False)
X2 = poly.fit_transform(X)
print(X2)
model = LinearRegression().fit(X2, y)
yfit = model.predict(X2)
plt.scatter(x, y)
plt.plot(x, yfit);
簡單來說,蒐集到的資料屬性多,不一定每一項資料都會影響資料的預測結果,因此,我們對對原始資料進行一系列特徵工程處理,將每一屬性(欄位)提煉為特徵,作為輸入供演算法和模型使用,以加強機器學習模型訓練。
明日主題:機器學習-特徵工程(資料降維)
2.Day11-Scikit-learn介紹(3)_Feature Engineering
近日天氣秋風涼爽,小妹我是口琴手,後天樂團要公演,要來先趕進度惹